package co.edu.usbcali.unidades.dataaccess.dao;

import co.edu.usbcali.unidades.dataaccess.sessionFactory.HibernateSessionFactory;
import co.edu.usbcali.unidades.modelo.Autorizacion;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;

import org.hibernate.criterion.Example;

import java.math.BigDecimal;

import java.util.Date;
import java.util.List;
import java.util.Set;



public class AutorizacionDAO implements IAutorizacionDAO {
    private static final Log log = LogFactory.getLog(AutorizacionDAO.class);

    // property constants
    //public static final String  AUTCEDVISITANTE = "autCedVisitante";
    public static final String AUTCEDVISITANTE = "autCedVisitante";

    //public static final String  AUTCODIGO = "autCodigo";
    public static final String AUTCODIGO = "autCodigo";

    //public static final String  AUTDESCRIPCIONACTI = "autDescripcionActi";
    public static final String AUTDESCRIPCIONACTI = "autDescripcionActi";

    //public static final String  AUTDESCRIPCIONPERMI = "autDescripcionPermi";
    public static final String AUTDESCRIPCIONPERMI = "autDescripcionPermi";

    //public static final String  AUTEMPRESA = "autEmpresa";
    public static final String AUTEMPRESA = "autEmpresa";

    //public static final Date  AUTFECHA = "autFecha";
    public static final String AUTFECHA = "autFecha";

    //public static final String  AUTNOMBREVISITANTE = "autNombreVisitante";
    public static final String AUTNOMBREVISITANTE = "autNombreVisitante";

    private Session getSession() {
        return HibernateSessionFactory.getSession();
    }

    /**
    *
    * @param Instance
    *            Autorizacion Instance to persist
    * @throws RuntimeException
    *             when the operation fails
    */
    public void save(Autorizacion instance) {
        log.debug("saving Autorizacion instance");

        try {
            getSession().save(instance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }

    /**
    * @param Instance
    *            Autorizacion Instance to delete
    * @throws RuntimeException
    *             when the operation fails
    */
    public void delete(Autorizacion instance) {
        log.debug("deleting Autorizacion instance");

        try {
            getSession().delete(instance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re);
            throw re;
        }
    }

    /**
    *
    * @param Instance
    *            Autorizacion Instance to update
    * @throws RuntimeException
    *             when the operation fails
    */
    public void update(Autorizacion instance) {
        log.debug("updating Autorizacion instance");

        try {
            getSession().update(instance);
            log.debug("update successful");
        } catch (RuntimeException re) {
            log.error("update failed", re);
            throw re;
        }
    }

    public Autorizacion findById(String id) {
        log.debug("finding Autorizacion instance with id: " + id);

        try {
            Autorizacion instance = (Autorizacion) getSession()
                                                       .get(Autorizacion.class,
                    id);

            return instance;
        } catch (RuntimeException re) {
            log.error("finding Autorizacion failed", re);
            throw re;
        }
    }

    public List<Autorizacion> findByExample(Autorizacion instance) {
        log.debug("finding Autorizacion instance by example");

        try {
            List results = getSession().createCriteria("Autorizacion")
                               .add(Example.create(instance)).list();
            log.debug("find by example successful, result size: " +
                results.size());

            return results;
        } catch (RuntimeException re) {
            log.error("find by example failed", re);
            throw re;
        }
    }

    /**
    * Find all  Autorizacion entities with a specific property value.
    *
    * @param value
    *            the property value to match
    * @param propertyName
    *            the property to search in the instance
    * @return List< Autorizacion> found by query
        */
    public List<Autorizacion> findByProperty(String propertyName, Object value) {
        log.debug("finding Autorizacion instance with property: " +
            propertyName + ", value: " + value);

        try {
            String queryString = "from Autorizacion as model where model." +
                propertyName + "= ?";
            Query queryObject = getSession().createQuery(queryString);
            queryObject.setParameter(0, value);

            return queryObject.list();
        } catch (RuntimeException re) {
            log.error("find by property name failed", re);
            throw re;
        }
    }

    public List<Autorizacion> findByAutCedVisitante(Object autCedVisitante) {
        return findByProperty(AUTCEDVISITANTE, autCedVisitante);
    }

    public List<Autorizacion> findByAutCodigo(Object autCodigo) {
        return findByProperty(AUTCODIGO, autCodigo);
    }

    public List<Autorizacion> findByAutDescripcionActi(
        Object autDescripcionActi) {
        return findByProperty(AUTDESCRIPCIONACTI, autDescripcionActi);
    }

    public List<Autorizacion> findByAutDescripcionPermi(
        Object autDescripcionPermi) {
        return findByProperty(AUTDESCRIPCIONPERMI, autDescripcionPermi);
    }

    public List<Autorizacion> findByAutEmpresa(Object autEmpresa) {
        return findByProperty(AUTEMPRESA, autEmpresa);
    }

    public List<Autorizacion> findByAutFecha(Object autFecha) {
        return findByProperty(AUTFECHA, autFecha);
    }

    public List<Autorizacion> findByAutNombreVisitante(
        Object autNombreVisitante) {
        return findByProperty(AUTNOMBREVISITANTE, autNombreVisitante);
    }

    /**
    * Find all Autorizacion entities.
    *
    * @return List<Autorizacion> all Autorizacion instances
    */
    public List<Autorizacion> findAll() {
        log.debug("finding all Autorizacion instances");

        try {
            String queryString = "from Autorizacion";
            Query queryObject = getSession().createQuery(queryString);

            return queryObject.list();
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
    }

    public List<Autorizacion> findByCriteria(String whereCondition) {
        log.debug("finding Autorizacion " + whereCondition);

        try {
            String where = ((whereCondition == null) ||
                (whereCondition.length() == 0)) ? "" : ("where " +
                whereCondition);
            final String queryString = "select model from Autorizacion model " +
                where;
            Query query = getSession().createQuery(queryString);
            List<Autorizacion> entitiesList = query.list();

            return entitiesList;
        } catch (RuntimeException re) {
            log.error("find By Criteria in Autorizacion failed", re);
            throw re;
        }
    }

    public List<Autorizacion> findPageAutorizacion(String sortColumnName,
        boolean sortAscending, int startRow, int maxResults) {
        log.debug("finding Autorizacion findPageAutorizacion");

        if ((sortColumnName != null) && (sortColumnName.length() > 0)) {
            try {
                String queryString = "select model from Autorizacion model order by model." +
                    sortColumnName + " " + (sortAscending ? "asc" : "desc");

                return getSession().createQuery(queryString)
                           .setFirstResult(startRow).setMaxResults(maxResults)
                           .list();
            } catch (RuntimeException re) {
                throw re;
            }
        } else {
            try {
                String queryString = "select model from Autorizacion model";

                return getSession().createQuery(queryString)
                           .setFirstResult(startRow).setMaxResults(maxResults)
                           .list();
            } catch (RuntimeException re) {
                throw re;
            }
        }
    }

    public Long findTotalNumberAutorizacion() {
        log.debug("finding Autorizacion count");

        try {
            String queryString = "select count(*) from Autorizacion model";
            Query queryObject = getSession().createQuery(queryString);

            return (Long) queryObject.list().get(0);
        } catch (RuntimeException re) {
            throw re;
        }
    }
    
    //metodo que llena el data table de autorizacion buscando por nombre....
    public List<Autorizacion> consultaPorNombre_y_Usuario(String nombre,String usu){        	
    	List<Autorizacion> a;
        try {
            //String queryString = "select a from Autorizacion a, Usuario u where(u.usuContrasena=:usu and a.autNombreVisitante=:nombre)";
        	String queryString = "select a from Autorizacion a where(a.propietarioInmueble.priCodigo=:usu and a.autNombreVisitante like '%"+nombre+"%')";
            Query queryObject = getSession().createQuery(queryString);
            queryObject.setParameter("usu", usu);            
            a=queryObject.list();
            return a;
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
    }

	public List<Autorizacion> consultaPorCedula_y_Usuario(String cod, String usu) {
		List<Autorizacion> a;
        try {
            //String queryString = "select a from Autorizacion a, Usuario u where(u.usuContrasena=:usu and a.autCodigo=:codigo)";
        	String queryString = "select a from Autorizacion a where(a.propietarioInmueble.priCodigo=:usu and a.autCedVisitante like '%"+cod+"%')";
            Query queryObject = getSession().createQuery(queryString);
            queryObject.setParameter("usu", usu);           
            a=queryObject.list();
            return a;
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
	}
	
	public Autorizacion buscar(String cedula, Date fecha, String cod) {
		List<Autorizacion> a;
		Autorizacion auto = null;
        try {
            //String queryString = "select a from Autorizacion a, Usuario u where(u.usuContrasena=:usu and a.autCodigo=:codigo)";
        	String queryString = "select a from Autorizacion a where(a.autCedVisitante=:cedula and a.autFecha=:fecha and a.propietarioInmueble.priCodigo=:codProInm)";
            Query queryObject = getSession().createQuery(queryString);
            queryObject.setParameter("cedula", cedula);  
            queryObject.setParameter("fecha", fecha);
            queryObject.setParameter("codProInm", cod);
            a=queryObject.list();
            if(a.size() !=0){
            auto= a.get(0);
            }
            return auto;
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
	}
}
